#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

/*
联合体类型的声明 --> 关键字：union
像结构体一样，联合体也是由一个或者多个成员构成，这些成员可以不同的类型
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。
所以联合体也叫:共用体。
给联合体其中一个成员赋值，其他成员的值也跟着变化。
*/

//union Un
//{
//    int a; // 4
//    char b; // 1 --> 占分配的4字节中的第一个字节
//    //共用同一块空间，修改一个成员，其他成员值也跟着变化
//};
//
//int main()
//{
//    //printf("%zd\n", sizeof(union Un)); // 4
//
//    union Un u;
//    printf("%p\n", &u);
//    printf("%p\n", &(u.a));
//    printf("%p\n", &(u.b));
//    //地址相同
//
//    return 0;
//}


//联合的大小至少是最大成员的大小。
//当最大成员大小不是最大对齐数的整数倍的时候，就要对齐到最大对齐数的整数倍。

//union Un1
//{
//	char c[5]; // 5
//	int i; // 4
//
//	//也存在对齐现象，计算方式与结构体相同
//};
//
//union Un2
//{
//	short c[7]; // 14    2  8 -> 2
//	int i; // 4    4  8 -> 4
//};
//
//int main()
//{
//	printf("sizeof(union Un1) = %zd\n", sizeof(union Un1)); // 8
//    printf("sizeof(union Un2) = %zd\n", sizeof(union Un2)); // 16
//
//	return 0;
//}



/*
使用联合体是可以节省空间的，举例:
比如，我们要搞一个活动，要上线一个礼品兑换单，礼品兑换单中有三种商品:图书、杯子、衬衫
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸
*/

/*
图书:库存量、价格、商品类型、书名、作者、页数
杯子:库存量、价格、商品类型、设计
衬衫:库存量、价格、商品类型、设计、可选颜色、可选尺寸
*/

//struct gift_list
//{
//	//公共属性：
//    int stock_num; //库存量
//	double price; //价格
//    int item_type; //商品类型
//
//	//特殊属性：
//	char title[20]; //书名
//    char author[20]; //作者
//    int page_num; //页数
//
//    char design[20]; // 设计
//    int color; // 可选颜色
//    int size; // 可选尺寸
//
//    //这样设计比较浪费内存
//};

//struct gift_list
//{
//	//公共属性：
//    int stock_num; //库存量
//	double price; //价格
//    int item_type; //商品类型
//
//	union //匿名联合体
//	{
//		struct // 匿名结构体
//		{
//			char title[20]; //书名
//		    char author[20]; //作者
//		    int page_num; //页数
//		} book;
//		struct
//		{
//			char design[20]; // 设计
//		} cup;
//		struct
//		{
//			char design[20]; // 设计
//		    int color; // 可选颜色
//		    int size; // 可选尺寸
//		} shirt;
//	}item;
//};



////用联合体判断大小端
//union Un
//{
//	char c; // 1
//    int i; // 4
//
//	//低地址 --> 高地址
//	// 01 00 00 00  --> 小端
//	// 00 00 00 01  --> 大端
//};
//
////int check_sys()
////{
////	union Un u;
////	u.i = 1;
////	if (u.c == 1)
////		return 1;
////	else
////		return 0;
////}
//
////int check_sys()
////{
////	union Un u;
////	u.i = 1;
////	return u.c;
////}
//
//int check_sys()
//{
//	union
//	{
//		char c; // 1
//		int i; // 4
//	}u;
//	u.i = 1;
//	return u.c;
//}
//
//int main()
//{
//	if (check_sys())
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//}
